extern "C" {
#include <libavformat/avformat.h>
#include <libavdevice/avdevice.h>
#include <libavcodec/avcodec.h>
#include <libavutil/avutil.h>
#include <libavutil/opt.h>
#include <libswresample/swresample.h>
}

#include <iostream>
#include <fstream>

volatile sig_atomic_t stop_flag = 0;
void signal_handler(int signal) {
    stop_flag = 1;
}
int main() {
    // 初始化FFmpeg库
    avdevice_register_all();
    show_dshow_device();

    // 设置输入格式和设备
    const char* input_format = "dshow"; // macOS使用avfoundation
    const char* input_device = "audio=Mic (Realtek(R) Audio)";// 麦克风设备,从show_dshow_device()的输出列表里找到
    const char* output_file = "output.pcm";   // 输出文件

    AVFormatContext* format_ctx = avformat_alloc_context();
    const AVInputFormat* input_fmt = av_find_input_format(input_format);

    if (!input_fmt) {
        std::cerr << "无法找到输入格式: " << input_format << std::endl;
        return -1;
    }

    // 打开音频设备
    AVDictionary* options = nullptr;
    av_dict_set(&options, "sample_rate", "44100", 0); // 设置采样率
    av_dict_set(&options, "channels", "1", 0);       // 设置声道数

    if (avformat_open_input(&format_ctx, input_device, input_fmt, &options))
    {
        std::cerr << "无法打开音频设备" << std::endl;
        return -1;
    }

    // 打印设备信息
    av_dump_format(format_ctx, 0, input_device, 0);

    // 打开输出文件
    std::ofstream out_file(output_file, std::ios::binary);
    if (!out_file.is_open()) {
        std::cerr << "无法打开输出文件" << std::endl;
        return -1;
    }

    AVPacket pkt;
    av_init_packet(&pkt);
    int count = 10;
    int i = 0;
    // 读取音频数据并写入文件
    while (av_read_frame(format_ctx, &pkt) >= 0 && i++ < count) {
        out_file.write(reinterpret_cast<char*>(pkt.data), pkt.size);
        av_packet_unref(&pkt);
    }

    // 清理资源
    avformat_close_input(&format_ctx);
    out_file.close();

    std::cout << "PCM数据已保存到: " << output_file << std::endl;
    return 0;
}